package com.qq.open.qzone.blog;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;

import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.log4j.Logger;

import com.qq.open.common.OpenQqConstants;
import com.qq.open.common.OpenQqUtils;
import com.qq.open.common.json.JSONException;
import com.qq.open.common.json.JSONObject;
import com.qq.open.qzone.bean.param.QqAddBlogParamBean;
import com.qq.open.qzone.bean.result.QqAddBlogResultBean;

/**
 * 登录用户发表一篇新日志
 * 
 * @author HaoLiang
 * @version 0.1.1
 * 
 */
public class QqAddOneBlog {
	
	/** 日志 */
	private Logger log = Logger.getLogger(QqAddOneBlog.class);
	
	/** QQ互联工具类 */
	private	OpenQqUtils oqu = new OpenQqUtils();

	/**
	 * 登录用户发表一篇新日志
	 * 
	 * @param paramBean 参数
	 * @return 接口返回的数据
	 * @throws JSONException 
	 * @throws IOException 
	 */
	public QqAddBlogResultBean addOneBlog(QqAddBlogParamBean paramBean) throws JSONException, IOException {
		
		// 日志
		log.info("登录用户发表一篇新日志 开始....");

		// 获取接口的参数
		MultipartEntity reqEntity = this.getPostParam(paramBean);
		
		// 接口返回的json数据
		String jsonData = oqu.doPost(OpenQqConstants.QQ_ADD_ONE_BLOG_URL, reqEntity);
		
		// 返回接口返回的数据
		QqAddBlogResultBean resultBean = this.jsonToBean(jsonData);
		
		// 日志
		log.info("登录用户发表一篇新日志 结束....");
		
		return resultBean;
	}

	
	/**
	 * 获取接口的参数
	 * 
	 * @param addBlogBean 参数
	 * @return 接口参数
	 * @throws UnsupportedEncodingException 
	 */
	private MultipartEntity getPostParam(QqAddBlogParamBean addBlogBean)
			throws UnsupportedEncodingException {
		MultipartEntity reqEntity = new MultipartEntity();

		// AccessToken
		reqEntity.addPart("access_token", new StringBody(addBlogBean
				.getAccessToken()));

		// AppId
		reqEntity.addPart("oauth_consumer_key", new StringBody(oqu.getConfigValue("qq.appid")));

		// Openid
		reqEntity.addPart("openid", new StringBody(addBlogBean.getOpenId()));

		// 定义API返回的数据格式
		reqEntity.addPart("format", new StringBody("json"));

		// 日志标题
		reqEntity.addPart("title", new StringBody(addBlogBean.getTitle(),
				Charset.forName("UTF-8")));

		// 日志内容
		reqEntity.addPart("content", new StringBody(addBlogBean.getContent(),
				Charset.forName("UTF-8")));

		return reqEntity;
	}
	
	
	/**
	 * 把接口返回的json数据转换成JavaBean
	 * 
	 * @param jsonData 接口返回的数据
	 * @return JavaBean数据
	 * @throws JSONException 
	 * @throws JSONException 
	 */
	private QqAddBlogResultBean jsonToBean(String jsonData) throws JSONException {
		// 接口返回数据Bean
		QqAddBlogResultBean resultBean = new QqAddBlogResultBean();
		
		// 接口返回的数据json
		JSONObject jsonObjRoot;
		try {
			jsonObjRoot = new JSONObject(jsonData);
			
			// 接口返回错误的场合
			if (jsonObjRoot.getInt("ret") != 0) {
				// 设置错误标识为真
				resultBean.setErrorFlg(true);
				
				// 设置错误编号
				resultBean.setErrorCode(jsonObjRoot.get("ret").toString());
				
				// 设置错误信息
				resultBean.setErrorMes(jsonObjRoot.getString("msg"));
			} else {
				resultBean.setUrl(jsonObjRoot.get("url").toString());
			}
		} catch (JSONException e) {
			e.printStackTrace();
			// 把错误的json数据写入Log
			log.error("addOneBlog异常，json数据是：" + jsonData);
			throw e;
		}
		
		
		return resultBean;
	}
}
